utop からコンパイル済みモジュールの関数を呼び出したい
utopで #load することでコンパイル済みのモジュールの関数を対話環境から呼び出すことができる(MinCamlではC言語のライブラリ float.o を呼び出す必要があるため使えなかった)
TAPLのサンプルプログラム arith を例に、モジュールのロードと関数呼び出しを試してみる。
まずは、arith のディレクトリへ移動して utopを起動する。
$ utop
#load でモジュールのロードを、#use でOCamlソースコードの読み込みを行う(#use はトップレベルに直接インクルードされる)
code:utop
mail.ml に定義されている process_file を呼んでみる。以下のように実行結果が表示されればOK
code:utop
# let () = let _ = process_file "test.f" in ();;
true
false
0
1
false
utop内でロードする代わりに以下のように呼び出してもOK
code:sh
$ utop support.cmo syntax.cmo core.cmo parser.cmo lexer.cmo main.cmo -init main.ml
# let () = let _ = process_file "test.f" in ();;
true
false
0
1
false
おまけの ocamlmktop
code:Makefile
f.top: $(OBJS) main.cmo
@echo Linking $@
ocamlmktop -warn-error -31 -o $@ $(COMMONOBJS) $(OBJS)
ocamlmktop 時に以下のようなエラーが出るため -warn-error -31 を追加した。
→ 既存の Parser と Lexer と名前がぶつかるのが原因らしい。
code:build-error
ocamlmktop -o f.top support.cmo syntax.cmo core.cmo parser.cmo lexer.cmo main.cmo
File "parser.cmo", line 1:
Error (warning 31 module-linked-twice): files parser.cmo and /Users/thata/.opam/default/lib/ocaml/compiler-libs/ocamlcommon.cma(Parser) both define a module named Parser File "lexer.cmo", line 1:
Error (warning 31 module-linked-twice): files lexer.cmo and /Users/thata/.opam/default/lib/ocaml/compiler-libs/ocamlcommon.cma(Lexer) both define a module named Lexer f.top を起動して、Main.process_file を実行してみる。ちゃんと動いてそう。
code:sh
./f.top
OCaml version 4.14.0
# open Main;;
# let () = let _ = process_file "test.f" in ();;
true
false
0
1
false
#